#ifndef GAME_INIT_H
#define GAME_INIT_H
#include "Node.h"

std::vector<std::vector<Node>> init_Game()
{
    std::vector<std::vector<Node>> nestedNodes {
        // First inner vector with its Nodes
        {
            Node(0, 0, State::EMPTY),
            Node(0, 1, State::EMPTY),
            Node(0, 2, State::EMPTY)
        },
        // Second inner vector with its Nodes
        {
            Node(1, 0, State::EMPTY),
            Node(1, 1, State::EMPTY),
            Node(1, 2, State::EMPTY)
        },
         {
            Node(2, 0, State::EMPTY),
            Node(2, 1, State::EMPTY),
            Node(2, 2, State::EMPTY)
        },
         {
            Node(3, 0, State::EMPTY),
            Node(3, 1, State::EMPTY),
            Node(3, 2, State::EMPTY),
            Node(3, 3, State::EMPTY),
            Node(3, 4, State::EMPTY),
            Node(3, 5, State::EMPTY)
        },
          {
            Node(4, 0, State::EMPTY),
            Node(4, 1, State::EMPTY),
            Node(4, 2, State::EMPTY)
        },
         {
            Node(5, 0, State::EMPTY),
            Node(5, 1, State::EMPTY),
            Node(5, 2, State::EMPTY)
        },
         {
            Node(6, 0, State::EMPTY),
            Node(6, 1, State::EMPTY),
            Node(6, 2, State::EMPTY)
        },
        // ... more inner vectors with Nodes as needed
    };

    // Manually connect neighbors here
    // 0,0
    nestedNodes[0][0].add_neighbor(&nestedNodes[0][1]);
    nestedNodes[0][0].add_neighbor(&nestedNodes[1][0]);
    nestedNodes[0][0].add_neighbor(&nestedNodes[3][0]);

    // 0,1
    nestedNodes[0][1].add_neighbor(&nestedNodes[0][0]);
    nestedNodes[0][1].add_neighbor(&nestedNodes[1][1]);
    nestedNodes[0][1].add_neighbor(&nestedNodes[0][2]);

    // 0,2
    nestedNodes[0][2].add_neighbor(&nestedNodes[0][1]);
    nestedNodes[0][2].add_neighbor(&nestedNodes[1][2]);
    nestedNodes[0][2].add_neighbor(&nestedNodes[3][5]);

    // 1,0
    nestedNodes[1][0].add_neighbor(&nestedNodes[0][0]);
    nestedNodes[1][0].add_neighbor(&nestedNodes[3][1]);
    nestedNodes[1][0].add_neighbor(&nestedNodes[2][0]);
    nestedNodes[1][0].add_neighbor(&nestedNodes[1][1]);

    // 1,1
    nestedNodes[1][1].add_neighbor(&nestedNodes[0][1]);
    nestedNodes[1][1].add_neighbor(&nestedNodes[1][0]);
    nestedNodes[1][1].add_neighbor(&nestedNodes[1][2]);
    nestedNodes[1][1].add_neighbor(&nestedNodes[2][1]);

    // 1,2
    nestedNodes[1][2].add_neighbor(&nestedNodes[1][1]);
    nestedNodes[1][2].add_neighbor(&nestedNodes[2][2]);
    nestedNodes[1][2].add_neighbor(&nestedNodes[3][4]);
    nestedNodes[1][2].add_neighbor(&nestedNodes[0][2]);

    // 2,0
    nestedNodes[2][0].add_neighbor(&nestedNodes[1][0]);
    nestedNodes[2][0].add_neighbor(&nestedNodes[3][2]);
    nestedNodes[2][0].add_neighbor(&nestedNodes[2][1]);

    // 2,1
    nestedNodes[2][1].add_neighbor(&nestedNodes[2][0]);
    nestedNodes[2][1].add_neighbor(&nestedNodes[1][1]);
    nestedNodes[2][1].add_neighbor(&nestedNodes[2][2]);

    // 2,2
    nestedNodes[2][2].add_neighbor(&nestedNodes[2][1]);
    nestedNodes[2][2].add_neighbor(&nestedNodes[3][3]);
    nestedNodes[2][2].add_neighbor(&nestedNodes[1][2]);

    // 3,0
    nestedNodes[3][0].add_neighbor(&nestedNodes[0][0]);
    nestedNodes[3][0].add_neighbor(&nestedNodes[6][0]);
    nestedNodes[3][0].add_neighbor(&nestedNodes[3][1]);


    // 3,1
    nestedNodes[3][1].add_neighbor(&nestedNodes[1][0]);
    nestedNodes[3][1].add_neighbor(&nestedNodes[3][0]);
    nestedNodes[3][1].add_neighbor(&nestedNodes[5][0]);
    nestedNodes[3][1].add_neighbor(&nestedNodes[3][2]);

     // 3,2
    nestedNodes[3][2].add_neighbor(&nestedNodes[2][0]);
    nestedNodes[3][2].add_neighbor(&nestedNodes[3][1]);
    nestedNodes[3][2].add_neighbor(&nestedNodes[4][0]);

    // 3,3
    nestedNodes[3][3].add_neighbor(&nestedNodes[2][2]);
    nestedNodes[3][3].add_neighbor(&nestedNodes[3][4]);
    nestedNodes[3][3].add_neighbor(&nestedNodes[4][2]);

    // 3,4
    nestedNodes[3][4].add_neighbor(&nestedNodes[1][2]);
    nestedNodes[3][4].add_neighbor(&nestedNodes[3][3]);
    nestedNodes[3][4].add_neighbor(&nestedNodes[5][2]);
    nestedNodes[3][4].add_neighbor(&nestedNodes[3][5]);

    // 3,5
    nestedNodes[3][5].add_neighbor(&nestedNodes[3][4]);
    nestedNodes[3][5].add_neighbor(&nestedNodes[0][2]);
    nestedNodes[3][5].add_neighbor(&nestedNodes[6][2]);
    
    // 4,0
    nestedNodes[4][0].add_neighbor(&nestedNodes[3][2]);
    nestedNodes[4][0].add_neighbor(&nestedNodes[5][0]);
    nestedNodes[4][0].add_neighbor(&nestedNodes[4][1]);

    // 4,1
    nestedNodes[4][1].add_neighbor(&nestedNodes[4][0]);
    nestedNodes[4][1].add_neighbor(&nestedNodes[5][1]);
    nestedNodes[4][1].add_neighbor(&nestedNodes[4][2]);

    // 4,2
    nestedNodes[4][2].add_neighbor(&nestedNodes[4][1]);
    nestedNodes[4][2].add_neighbor(&nestedNodes[3][3]);
    nestedNodes[4][2].add_neighbor(&nestedNodes[5][2]);

     // 5,0
    nestedNodes[5][0].add_neighbor(&nestedNodes[3][1]);
    nestedNodes[5][0].add_neighbor(&nestedNodes[4][0]);
    nestedNodes[5][0].add_neighbor(&nestedNodes[5][1]);
    nestedNodes[5][0].add_neighbor(&nestedNodes[6][0]);

    // 5,1
    nestedNodes[5][1].add_neighbor(&nestedNodes[5][0]);
    nestedNodes[5][1].add_neighbor(&nestedNodes[4][1]);
    nestedNodes[5][1].add_neighbor(&nestedNodes[5][2]);
    nestedNodes[5][1].add_neighbor(&nestedNodes[6][1]);

    // 5,2
    nestedNodes[5][2].add_neighbor(&nestedNodes[4][2]);
    nestedNodes[5][2].add_neighbor(&nestedNodes[5][1]);
    nestedNodes[5][2].add_neighbor(&nestedNodes[3][4]);
    nestedNodes[5][2].add_neighbor(&nestedNodes[6][2]);

    // 6,0
    nestedNodes[6][0].add_neighbor(&nestedNodes[3][0]);
    nestedNodes[6][0].add_neighbor(&nestedNodes[5][0]);
    nestedNodes[6][0].add_neighbor(&nestedNodes[6][1]);

    // 6,1
    nestedNodes[6][1].add_neighbor(&nestedNodes[6][0]);
    nestedNodes[6][1].add_neighbor(&nestedNodes[5][1]);
    nestedNodes[6][1].add_neighbor(&nestedNodes[6][2]);

    // 6,1
    nestedNodes[6][2].add_neighbor(&nestedNodes[6][1]);
    nestedNodes[6][2].add_neighbor(&nestedNodes[5][2]);
    nestedNodes[6][2].add_neighbor(&nestedNodes[3][5]);


    return nestedNodes;
}

#endif 